package com.media.themovieworld;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;

import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.google.android.gcm.GCMRegistrar;
import com.media.themovieworld.api.ApiParams;
import com.media.themovieworld.api.RequestModel;
import com.media.themovieworld.common.fragment.MovieTaskScreen.MovieTaskListener;
import com.media.themovieworld.model.RegisterResultModel;

/**
 * Helper class used to communicate with the demo server.
 */
public final class ServerUtilities implements Config {

    private static final int MAX_ATTEMPTS = 5;
    private static final int BACKOFF_MILLI_SECONDS = 2000;
    private static final Random random = new Random();
    private static String TAG = ServerUtilities.class.getSimpleName();

    /**
     * Register this account/device pair within the server.
     *
     * @return whether the registration succeeded or not.
     */
   public static boolean register(final Context context, final String regId) {
        Log.i(TAG, "registering device (regId = " + regId + ")");
//        String serverUrl = SERVER_URL + "/register.php";
        Map<String, String> params = new HashMap<String, String>();
        params.put("regId", regId);
        
        long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000);
        // Once GCM returns a registration id, we need to register it in the
        // demo server. As the server might be down, we will retry it a couple
        // times.
        for (int i = 1; i <= MAX_ATTEMPTS; i++) {
            Log.d(TAG, "Attempt #" + i + " to register");
            //                displayMessage(context, context.getString(
//                        R.string.server_registering, i, MAX_ATTEMPTS));
//                post(serverUrl, params);
                GCMRegistrar.setRegisteredOnServer(context, true);
//                String message = context.getString(R.string.server_registered);
//                CommonUtilities.displayMessage(context, message);
			return true;
        }
//        String message = context.getString(R.string.server_register_error,
//                MAX_ATTEMPTS);
//        CommonUtilities.displayMessage(context, message);
        return false;
    }
   
//    private static Thread sendTest = new Thread() {
//        public void run() {
//            try {
//                String msgTxt = "test message sent from device";
////                String serverUrl = SERVER_URL + "/send.php";
//                Map<String, String> params = new HashMap<String, String>();
//                params.put("msg", msgTxt);
//                post(serverUrl, params);
//                Log.i(TAG, "POST sent");
//            } catch (Exception e) {
//                Log.e(TAG, e.getMessage());
//            }
//        }
//    };
            
    static void send(final Context context) {
//        sendTest.start();
        String message = "Message sent";
        displayMessage(context, message);
    }
    
 // Notifies UI to display a message. Used by the UI and the service.
    static void displayMessage(Context context, String message) {
        Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
        intent.putExtra(EXTRA_MESSAGE, message);
        context.sendBroadcast(intent);
    }
    
    /**
     * Unregister this account/device pair within the server.
     */
//    static void unregister(final Context context, final String regId) {
//        Log.i(TAG, "unregistering device (regId = " + regId + ")");
////        String serverUrl = SERVER_URL + "/unregister.php";
//        Map<String, String> params = new HashMap<String, String>();
//        params.put("regId", regId);
//        try {
//            post(serverUrl, params);
//            GCMRegistrar.setRegisteredOnServer(context, false);
//            String message = context.getString(R.string.server_unregistered);
//            CommonUtilities.displayMessage(context, message);
//        } catch (IOException e) {
//            // At this point the device is unregistered from GCM, but still
//            // registered in the server.
//            // We could try to unregister again, but it is not necessary:
//            // if the server tries to send a message to the device, it will get
//            // a "NotRegistered" error message and should unregister the device.
//            String message = context.getString(R.string.server_unregister_error,
//                    e.getMessage());
//            CommonUtilities.displayMessage(context, message);
//        }
//    }

    /**
     * Issue a POST request to the server.
     *
     * @param endpoint POST address.
     * @param params request parameters.
     *
     * @throws IOException propagated from POST.
     */
    private static void post(String endpoint, Map<String, String> params)
            throws IOException {
        URL url;
        try {
            url = new URL(endpoint);
        } catch (MalformedURLException e) {
            throw new IllegalArgumentException("invalid url: " + endpoint);
        }
        StringBuilder bodyBuilder = new StringBuilder();
        Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
        // constructs the POST body using the parameters
        while (iterator.hasNext()) {
            Entry<String, String> param = iterator.next();
            bodyBuilder.append(param.getKey()).append('=')
                    .append(param.getValue());
            if (iterator.hasNext()) {
                bodyBuilder.append('&');
            }
        }
        String body = bodyBuilder.toString();
        Log.v(TAG, "Posting '" + body + "' to " + url);
        byte[] bytes = body.getBytes();
        HttpURLConnection conn = null;
        try {
            Log.v(TAG, "opening connection...");
            conn = (HttpURLConnection) url.openConnection();
            Log.v(TAG, "setting connection options...");
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setFixedLengthStreamingMode(bytes.length);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded;charset=UTF-8");
            // post the request
            Log.v(TAG, "getting the connection...");
            OutputStream out = conn.getOutputStream();
            Log.v(TAG, "writing data to the connection...");
            out.write(bytes);
            out.close();
            // handle the response
            int status = conn.getResponseCode();
            if (status != 200) {
              throw new IOException("Post failed with error code " + status);
            }
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
      }
}

